"V linuxu je vše soubor. Pokud to není soubor, je to proces."
Pojmy program (aplikace), příkaz a proces se často zaměňují. Program je soubor na disku, který si můžete spustit, a on bude vykonávat nějakou činnost. Když ho spustíte, nahraje se do paměti a tím se z něj stane proces. Jeden program (defacto libovolný příkaz) tedy může být spuštěn více uživateli. Každý z nich má ale svůj vlastní proces (s kopií původního programu).
Terminologicky rozlišujeme procesy na úlohy a služby. Technicky se však od sebe nijak neliší.
/etc/init.d/. Službě se v linuxu také poeticky říká démon (daemon, démon). I zastavená služba není nic jiného než program (soubor) na disku.Linux byl od počátku víceúlohový systém, takže v něm může být současně spuštěno více procesů.
Stejně jako soubory, tak i procesy jsou vlastněny určitým uživatelem, podléhají přístupovým právům. Na uživatelské úrovni jsou soubory identifikovány svým jménem (které odpovídá jménu spustitelného souboru), ale systém je jednoznačně identifikuje číslem PID (Proces ID).
Prvním procesem, který je po startu systému spuštěn a má pořadové číslo 1 je init. Je to takový linuxový Adam. Všechny další procesy jsou jeho potomky. Jeho ukončení vede k ukončení celého systému. Další proces má přiřazeno číslo 2, 3, 4... až po jisté číslo n. aTaa je uložena v souboru /proc/sys/kernel/pid_max. Pokud systém dosáhne maxima, začne přidělovat volná čísla zase od začátku.
top Příkaz top je interaktivní program sloužící k výpisu procesů, který je seřazen podle určitého klíče. Nejčastěji se řadí podle spotřebovaného procesorového času (%CPU), ale je možné klíč změnit a řadit třeba podle obsazené paměti RAM (%MEM).

Obrázek: Část výpisu procesů příkazem top
Chod programu top můžeme ovlivnit těmito klávesami:
SIGTERM (15).htop O něco pokročilejší a hezčí (barvy) je program htop. Na rozdíl od příkazu top výchozí instalaci Debianu chybí. Chcete-li jej používat, musíte ho doinstalovat # apt install htop. Všimněte si přehledného ovládání pomocí funkčních kláves F1 -- F10.

Obrázek: Část výpisu procesů příkazem htop
ps Klasičtějším způsobem zobrazení procesů je program ps. Tento příkaz se používá zejména ve spojení s filtrem grep.
Příkaz ps bez parametrů pouze vypíše procesy spojené s jedním konkrétním terminálem aktuálního uživatele.
$ ps
PID TTY TIME CMD
30482 pts/6 00:00:00 bash
583 pts/6 00:00:00 ps
-x Volba -x zajistí vypsání všech vašich procesů:
$ ps -x
PID TTY STAT TIME COMMAND
13955 ? Ss 0:00 /bin/sh /usr/kde/3.5/bin/startkde
13982 ? Ss 0:00 gpg-agent --daemon
...
553 ? S 0:00 ispell -a -S -m -C -d czech
590 pts/2 R+ 0:00 ps x
-a Pokud vás zajímají procesy, které mají spuštěné i ostatní, použijete volbu -a, ale takto byste získali pouze procesy připojené k danému terminálu. Proto musíme přidat i volbu -x, která zajistí výpis procesů všech uživatelů na všech terminálech (na něm vidíte, že init má skutečně číslo 1).
$ ps -ax
PID TTY STAT TIME COMMAND
1 ? S 0:00 init [3]
2 ? SN 0:00 [ksoftirqd/0]
...
32525 ? S 0:03 konsole
32526 pts/7 Ss 0:00 /bin/bash
623 ? S 0:00 ispell -a -S -m -C -d czech
649 pts/6 R+ 0:00 ps ax
-u Tento výpis není příliš dobrý, protože nezjistíte, kterému uživateli patří který proces. Parametr -u zajistí podrobnější výpis.
$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1476 396 ? S Jan05 0:00 init [3]
root 2 0.0 0.0 0 0 ? SN Jan05 0:00 [ksoftirqd/0]
...
misak 32525 0.1 6.5 30460 16796 ? S 18:57 0:03 konsole
misak 32526 0.0 0.6 3544 1776 pts/7 Ss+ 18:57 0:00 /bin/bash
misak 623 0.1 4.1 12088 10736 ? S 19:16 0:01 ispell -a -S -m -C -d czech
misak 726 0.0 0.3 2896 964 pts/6 R+ 19:28 0:00 ps aux
Myslete na to, že běžný uživatel může ukončovat pouze své vlastní procesy. Root může pochopitelně ukončovat jakýkoliv proces, skupinu procesů nebo všechny procesy konkrétního uživatele nebo systému.
Ukázkový příklad (abychom si to vyzkoušeli). Spusťte příkaz
$ ping 8.8.8.8
Příkaz vrací informace od vzdáleného serveru s IP 8.8.8.8. K čemu je to dobré teď ponechme stranou. Příkaz poběží tak dlouho, dokud jej neukončíme pomocí Ctrl+C (Cancel).
Pokud jej spustíme s parametrem &, spustí se na pozadí. Jeho výstup však bude nadále směřovat na standardní výstup (terminál):
$ ping 8.8.8.8 &
Tentokrát už Ctrl+C tak úplně nefunguje. Spuštěný proces musíme ukončit jinak.
ps -a zjistěte PID procesu, se kterým chceme učinit krátký proces 😁$ ps -x
PID TTY STAT TIME COMMAND
5206 ? Ss 0:00 /lib/systemd/systemd --user
5207 ? S 0:00 (sd-pam)
5213 ? S 0:00 sshd: machac@pts/0
5214 pts/0 Ss+ 0:00 -bash
12008 ? S 0:00 sshd: machac@pts/1
12009 pts/1 Ss 0:00 -bash
12509 pts/0 S 0:00 ping 8.8.8.8
12519 pts/1 R+ 0:00 ps x
kill 12509 proces ukončete.[1]+ Terminated ping 8.8.8.8
A je to.
Pokud náš program nelze ukončit žádným z obyčejných způsobů a dokonce neodpovídá ani na příkaz kill (je zřejmě zacyklený a k vykonání příkazu se nedostane) je možné využít jiné typy signálů vysílaných procesu programem kill (jejich seznam je níže v textu). Standardně je zasílán signál 15 neboli SIGTERM, který vyvolává exit. Můžete zkusit využít signálu 9 SIGKILL, který má takřka 100% šanci na úspěch.
# kill -9 12509
Výpis všech signálů vypíšete příkazem kill -l (list):
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
Tato sada příkazů je užitečná spíše rootovi. Proto jsou uvozené znakem
#
killall Pokud chceme ukončit proces dle jména (vhodné při mnoha procesech jednoho programu), lze využít program killall:
# killall nazev_procesu
Jako v předchozím případě se defaultně posílá signál 15 TERM. Zabití všech procesů konkrétního uživatele provedeme příkazem:
# killall -u username
pkill Umožní mj. násilně odhlásit uživatele:
# pkill -KILL -u username
Implicitně se všechny naše procesy (spíše úlohy) spouští na popředí. Můžeme je ale z různých důvodů chtít spustit na pozadí. Programů na pozadí můžeme z jednoho terminálu spustit více souběžně. Jak se v nich potom ale vyznat, když jim chceme posílat různé signály? Jednoduše, neboť Bash si tyto úlohy (anglicky jobs) čísluje (1, 2, 3 atd.).
& Občas se každému stane, že je připojen na konzoli a pustí příkaz, který běží dlouho a konzoli nám tím blokuje. Pokud proces nic nevypisuje (nebo nás výpis nezajímá) můžeme proces pustit na pozadí. Pokud rovnou víme, že proces poběží dlouho, stačí na konec příkazu zadat znak &. Typicky při zálohování nebo kopírování:
$ tar cvft zaloha.tar.gz /etc/* &
a dále můžeme v konzoli pracovat. Po dokončení úlohy jsme systémem informováni, jak činnost dopadla:
[1]+ Dokončena tar cvft zaloha.tar.gz /etc/*
Číslo na začátku je identifikátor úlohy (jobu). Úloh na pozadí může být samozřejmě více.
Vraťme se k našemu problému – spustili jsme zálohování, ale nedali jsme za konec &, takže se proces spustil na popředí. Nevadí, pomocí Ctrl+Z úlohu pozastavíme.
[1]+ Pozastavena tar cvft zaloha.tar.gz /etc/*
jobs Seznam běžících (Running) nebo stojících (Stopped) úloh získáme příkazem jobs.
jobs
[2]+ Pozastavena ftp [ftp.xxx.cz](http://ftp.xxx.cz)
[3]- Pozastavena ping 188.120.193.2 > vystup &
fg a bg Pomocí příkazů fg (foreground) a bg (background) můžeme určit, jak budou procesy dále spuštěny. Zadáme třeba bg %3 (jde to i bez znaku procento bg 3). Proces pingu se dále rozběhne na pozadí a jobs ukáže:
# jobs
[2]+ Pozastavena ftp [ftp.xxx.cz](http://ftp.xxx.cz)
[3]- Běží ping 188.120.193.2 > vystup &
Pomocí fg 2 se můžeme vrátit do procesu s ftp klientem. Ale není problém jej znovu odložit. Ještě malé zjednodušení – pokud si odložíme jen jeden proces (takže jobs ukazuje pouze jeden, může být zastavený nebo běžící), nemusíme už zadávat číslo jobu, ale stačí jen bg nebo fg.
Pokud máme na pozadí odložené úlohy a zkusíme se odhlásit, systém nás varuje a my tak můžeme předtím procesy korektně ukončit.
nohup Někdy se může stát, že jste u počítače na chvilku a potřebujete spustit nějaký proces na pozadí, který ale poběží dlouho. Můžete použít program nohup. Ten způsobí ignorování signálu SIGHUP, takže se proces neukončí při ukončení shellu.
$ nohup tar cvft zaloha.tar.gz /etc/*
Zálohování rovnou odsuneme na pozadí a můžeme se odhlásit. Příkaz nohup nám výstup programu uloží do souboru nohup.out v aktuálním adresáři. Pokud takový výstupní soubor není možné použít, zkusí ~/nohup.out.
Priorita procesu se nastavuje příkazem nice, který v překladu znamená „ohleduplnost“. Hodnota ohleduplnosti je číselné doporučení pro jádro, jak by měl být proces obsloužen ve vztahu k ostatním procesům. Rozsah hodnot pro příkaz nice je −20 až +19. Vysoká hodnota znamená nízkou prioritu (budete ohleduplní vůči ostatním uživatelům) a nízká nebo záporná hodnota znamená vysokou prioritu (nebudete ohleduplní).
Nově vzniklý proces dědí hodnotu ohleduplnosti po rodičích. Uživatel může pouze zvyšovat hodnotu ohleduplnosti svého procesu, ale nesmí jí už poté snižovat. Superuživatel root má neomezenou moc v ovládání ohleduplnosti procesů.
nice a renice Hodnotu ohleduplnosti může uživatel nastavit již při vzniku procesu a při běhu procesů jí může měnit příkazem renice. Příkaz nice přijímá jako argument příkazový řádek a příkaz renice očekává jako argument PID procesu nebo jméno uživatele. Příkazu renice se zadává hodnota ohleduplnosti v absolutním tvaru, u příkazu nice se ohleduplnost jako inkrement, který se odečte nebo přičte od aktuální hodnoty ohleduplnosti.
$ nice -n 8 /bin/velmi_narocna_uloha # zvýší ohleduplnost o 8
$ renice -3 7623 # nastaví ohleduplnost na 3
# renice 2 -u jirka # nastaví ohleduplnost procesů patřící Jirkovi na 2